// 这是一个请求的插件
import axios from 'axios'
import router from '@/router'
import store from '@/store'
import { Toast } from 'vant'

// 创建新的axios对象 --- 可以应对多个不同基地址接口服务器
// 就像下面代码一样，代表创建了2个axios对象，axiosA对应A地址，axiosB就对应B地址
// 以后我用axiosA发的请求就是给A地址服务器的，用axiosB发的请求就是给B地址服务器的
// const axioxA = axios.create({
//   baseURL: 'A地址'
// })
// const axioxB = axios.create({
//   baseURL: 'B地址'
// })

// 创建了一个新的axios对象，接口基地址对应的就是黑马头条的基地址
// 并且新对象的名字叫request
const request = axios.create({
  baseURL: 'http://geek.itheima.net'
})
// 加请求拦截器
request.interceptors.request.use(config => {
  // 给请求加headers
  if (store.state.tokenObj.token) {
    config.headers.Authorization = 'Bearer ' + store.state.tokenObj.token
  }
  return config
}, err => {
  return Promise.reject(err)
})

// 加响应拦截器 - 大家去官网复制 - 复制过来的时候把axios改成request
request.interceptors.response.use(
  response => {
    return response.data
  },
  async err => {
    // 只有当状态码是401才做token刷新
    if (err.response.status === 401) {
      // 代表token过期，我们需要利用refresh_token去得到新的token
      // 要用axios，要用axios，要用axios
      try {
        const res = await axios({
          url: 'http://geek.itheima.net/v1_0/authorizations',
          method: 'put',
          headers: {
            Authorization: 'Bearer ' + store.state.tokenObj.refresh_token
          }
        })
        // 把最新token存起来 -- refresh_token没变，所以用之前的，但是token变了，所以给新的对象
        // 对象里既要有最新的token，也要有之前的refresh_token
        store.commit('setToken', {
          token: res.data.data.token,
          refresh_token: store.state.tokenObj.refresh_token
        })
        // 用最新的token，把之前该发的请求再发一次
        return request(err.config)
      } catch {
        // 如果来到catch里，代表refresh_token都过期了
        // 那就删掉现有的token和refresh_token
        store.commit('logout')
        Toast('登录状态过期，请重新登录')
        // 然后打回登录页，让用户重新登录
        router.push('/login')
        return {}
      }
    }
    return Promise.reject(err)
  }
)

// 暴露出这个对象
export default request
